package main

// func main() {
// 	// 连接到RabbitMQ服务器
// 	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
// 	if err != nil {
// 		log.Fatalf("无法连接到RabbitMQ服务器：%s", err)
// 	}
// 	defer conn.Close()

// 	// 创建一个通道
// 	ch, err := conn.Channel()
// 	if err != nil {
// 		log.Fatalf("无法创建通道：%s", err)
// 	}
// 	defer ch.Close()

// 	// 声明一个队列
// 	queue, err := ch.QueueDeclare(
// 		"tasks_queue", // 队列名
// 		true,          // 持久性
// 		false,         // 自动删除
// 		false,         // 独占
// 		false,         // 等待服务器确认
// 		nil,           // 参数
// 	)
// 	if err != nil {
// 		log.Fatalf("无法声明队列：%s", err)
// 	}

// 	// 发送消息
// 	for i := 0; i < 10; i++ {
// 		msg:="task:"+strconv.Itoa(i)
// 		err = ch.Publish(
// 			"",           // 交换机
// 			queue.Name,   // 队列名
// 			false,        // 必须发送到队列
// 			false,        // 不等待服务器确认
// 			amqp.Publishing{
// 				DeliveryMode: amqp.Persistent, // 持久性消息
// 				ContentType:  "text/plain",
// 				Body:         []byte(msg),
// 			},
// 		)
// 		if err != nil {
// 			log.Fatalf("无法发送消息：%s", err)
// 		}
// 	}

// }

////////////////////订阅模式生产者
// package main

// import (
// 	"log"

// 	"github.com/streadway/amqp"
// )

// func failOnError(err error, msg string) {
// 	if err != nil {
// 		log.Fatalf("%s: %s", msg, err)
// 	}
// }

// func main() {
// 	// 连接到RabbitMQ服务器
// 	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
// 	failOnError(err, "Failed to connect to RabbitMQ")
// 	defer conn.Close()

// 	// 创建一个通道
// 	ch, err := conn.Channel()
// 	failOnError(err, "Failed to open a channel")
// 	defer ch.Close()

// 	// 声明一个交换机
// 	err = ch.ExchangeDeclare(
// 		"logs_direct",   // 交换机名称
// 		"direct", // 交换机类型
// 		true,     // 是否持久化
// 		false,    // 是否自动删除
// 		false,    // 是否内部使用
// 		false,    // 是否等待服务器响应
// 		nil,      // 其他属性
// 	)
// 	failOnError(err, "Failed to declare an exchange")

// 	// 发布消息到交换机
// 	body := "Hello, RabbitMQ!"
// 	err = ch.Publish(
// 		"logs_direct", // 交换机名称
// 		"asd",     // 路由键，留空表示广播给所有队列
// 		false,  // 是否等待服务器响应
// 		false,  // 其他属性
// 		amqp.Publishing{
// 			ContentType: "text/plain",
// 			Body:        []byte(body),
// 		},
// 	)
// 	failOnError(err, "Failed to publish a message")

// 	log.Printf("Message sent: %s", body)
// }

// /////////////Topics
// func failOnError(err error, msg string) {
// 	if err != nil {
// 		log.Fatalf("%s: %s", msg, err)
// 	}
// }

// func main() {
// 	// 连接到RabbitMQ服务器   http://localhost:15672/#/ cakan
// 	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
// 	failOnError(err, "Failed to connect to RabbitMQ")
// 	defer conn.Close()

// 	// 创建一个通道
// 	ch, err := conn.Channel()
// 	failOnError(err, "Failed to open a channel")
// 	defer ch.Close()

// 	// 声明一个交换机
// 	err = ch.ExchangeDeclare(
// 		"logs_topic", // 交换机名称
// 		"topic",      // 交换机类型
// 		true,         // 是否持久化
// 		false,        // 是否自动删除
// 		false,        // 是否内部使用
// 		false,        // 是否等待服务器响应
// 		nil,          // 其他属性
// 	)
// 	failOnError(err, "Failed to declare an exchange")

// 	// 定义要发送的消息的路由键和内容
// 	routingKey := "example.key.das"
// 	message := "Hello, RabbitMQ!"

// 	// 发布消息到交换机，并指定路由键
// 	err = ch.Publish(
// 		"logs_topic", // 交换机名称
// 		routingKey,   // 路由键
// 		false,        // 是否等待服务器响应
// 		false,        // 是否立即发送
// 		amqp.Publishing{
// 			ContentType: "text/plain",
// 			Body:        []byte(message),
// 		},
// 	)
// 	failOnError(err, "Failed to publish a message")

// 	log.Printf("Sent message: %s", message)
// }

// /////////////延时队列
import (
	"log"
	"os"
	"strings"

	"github.com/streadway/amqp"
)

func failOnError(err error, msg string) {
	if err != nil {
		log.Fatalf("%s: %s", msg, err)
	}
}

func main() {
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	failOnError(err, "Failed to connect to RabbitMQ")
	defer conn.Close()
	ch, err := conn.Channel()
	failOnError(err, "Failed to open a channel")
	defer ch.Close()
	body := "hello"
	// 将消息发送到延时队列上
	err = ch.Publish(
		"", 				// exchange 这里为空则不选择 exchange
		"test_delay",     	// routing key
		false,  			// mandatory
		false,  			// immediate
		amqp.Publishing{
			ContentType: "text/plain",
			Body:        []byte(body),
			Expiration: "5000",	// 设置五秒的过期时间
		})
	failOnError(err, "Failed to publish a message")

	log.Printf(" [x] Sent %s", body)
}
